package org.liang.common.utils.io;


import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;

/**
 * 文件操作工具类
 * 
 * @author L.Yang
 * @version 1.0, 2015年8月10日
 */
public class FileUtil {

    /**
     * 创建目录.
     * 
     * @param dirPath
     *            文件路径
     * @return 路径
     */
    public static File createDir(String dirPath) {
        File dir;
        try {
            dir = new File(dirPath);
            if (!dir.exists()) {
                FileUtils.forceMkdir(dir);
            }
        } catch (Exception e) {
            throw new RuntimeException("创建目录出错！", e);
        }
        return dir;
    }

    /**
     * 创建文件.
     * 
     * @param filePath
     *            文件
     * @return 文件
     */
    public static File createFile(String filePath) {
        File file;
        try {
            file = new File(filePath);
            File parentDir = file.getParentFile();
            if (!parentDir.exists()) {
                FileUtils.forceMkdir(parentDir);
            }
        } catch (Exception e) {
            throw new RuntimeException("创建文件出错！", e);
        }
        return file;
    }

    /**
     * 复制目录（不会复制空目录）.
     * 
     * @param srcPath
     *            源目录
     * @param destPath
     *            目标目录
     */
    public static void copyDir(String srcPath, String destPath) {
        try {
            File srcDir = new File(srcPath);
            File destDir = new File(destPath);
            if (srcDir.exists() && srcDir.isDirectory()) {
                FileUtils.copyDirectoryToDirectory(srcDir, destDir);
            }
        } catch (Exception e) {
            throw new RuntimeException("复制目录出错！", e);
        }
    }

    /**
     * 复制文件.
     * 
     * @param srcPath
     *            源文件
     * @param destPath
     *            目标文件
     */
    public static void copyFile(String srcPath, String destPath) {
        try {
            File srcFile = new File(srcPath);
            File destDir = new File(destPath);
            if (srcFile.exists() && srcFile.isFile()) {
                FileUtils.copyFileToDirectory(srcFile, destDir);
            }
        } catch (Exception e) {
            throw new RuntimeException("复制文件出错！", e);
        }
    }

    /**
     * 删除目录.
     * 
     * @param dirPath
     *            目录
     */
    public static void deleteDir(String dirPath) {
        try {
            File dir = new File(dirPath);
            if (dir.exists() && dir.isDirectory()) {
                FileUtils.deleteDirectory(dir);
            }
        } catch (Exception e) {
            throw new RuntimeException("删除目录出错！", e);
        }
    }

    /**
     * 删除文件.
     * 
     * @param filePath
     *            文件地址
     */
    public static void deleteFile(String filePath) {
        try {
            File file = new File(filePath);
            if (file.exists() && file.isFile()) {
                FileUtils.forceDelete(file);
            }
        } catch (Exception e) {
            throw new RuntimeException("删除文件出错！", e);
        }
    }

    /**
     * 重命名文件.
     * 
     * @param srcPath
     *            目标文件
     * @param destPath
     *            改名后的文件名
     */
    public static void renameFile(String srcPath, String destPath) {
        File srcFile = new File(srcPath);
        if (srcFile.exists()) {
            File newFile = new File(destPath);
            boolean result = srcFile.renameTo(newFile);
            if (!result) {
                throw new RuntimeException("重命名文件出错: " + newFile);
            }
        }
    }

    /**
     * 将字符串写入文件.
     * 
     * @param filePath
     *            文件
     * @param fileContent
     *            字符串
     */
    public static void writeFile(String filePath, String fileContent) {
        try {
            FileUtils.writeStringToFile(new File(filePath), fileContent);
        } catch (IOException e) {
            throw new RuntimeException("写文件出错:" + filePath, e);
        }
    }

    /**
     * 获取真实文件名（去掉文件路径）.
     */
    public static String getRealFileName(String fileName) {
        return FilenameUtils.getName(fileName);
    }

    /**
     * 判断文件是否存在.
     */
    public static boolean checkFileExists(String filePath) {
        return new File(filePath).exists();
    }
}
